/**
 * @file Public.h
 * @brief
 * @author FanLinLin
 * @date 2024-11-26
 */
#ifndef COMMON_H
#define COMMON_H

#include <stdio.h>
#include <stdint.h>
#include <string.h>
#include <stdbool.h>
#include "./perf_counter/perf_counter.h"

// clang-format off
/***********************************平台信息*******************************************/
#define BOOTLOADER_VERSION          "V.0.1.00"
void Error_Handler(void);
/***********************************平台信息*******************************************/

/***********************************调试串口*******************************************/
#define DebugMode   1 // 1:打开调试串口，0:关闭调试串口
#define OpenWDT     1 // 1:打开看门狗，0:关闭看门狗

#if (DebugMode == 1)
#define Printf(format, ...) printf(format, ##__VA_ARGS__)
#else
#define Printf(format, ...)
#endif
/***********************************调试串口*******************************************/

/***********************************硬件信息*******************************************/
#define MCU_PFLASH_PAGE_SIZE    0x02000                                  // MCU的PFlash单页大小为1KB、2KB、8KB等
#define MCU_PFLASH_SIZE         0x80000                                  // MCU的PFlash大小为128KB、512KB、1MB、2MB等
#define APP_FLASH_START_ADDR    0x24000                                  // APP Flash起始地址
#define APP_FLASH_SIZE          (MCU_PFLASH_SIZE - APP_FLASH_START_ADDR) // APP Flash大小
#define APP_FLASH_CRC_SIZE      0x4                                      // CRC 大小（字节）
#define APP_FLASH_CRC_ADDR      (MCU_PFLASH_SIZE - APP_FLASH_CRC_SIZE)   // CRC 地址
/***********************************硬件信息*******************************************/

/******************************       SysTick     ************************************/
#define Time_1ms                1
#define Time_1s                 (Time_1ms * 1000)
#define Time_1min               (Time_1s * 60)
#define Time_1hour              (Time_1min * 60)
#define Time_1day               (Time_1hour * 24)
#define GetSysTick_ms()         perfc_convert_ticks_to_ms(get_system_ticks())
#define GetSysTick_us()         perfc_convert_ticks_to_us(get_system_ticks())
#define Delay_ms(ms)            delay_ms(ms)
#define Delay_us(us)            delay_us(us)
void PrintSysTick(void);
extern uint32_t SystemCoreClock;
/******************************       SysTick     ************************************/
// clang-format on

/******************************       大小端      ************************************/
// 大小端与MCU相关,默认为小端.
typedef struct
{
    uint8_t LSB;
    uint8_t MSB;
} LittleEndian_16_t; // 小端 Little Endian

typedef struct
{
    uint8_t MSB;
    uint8_t LSB;
} BidEndian_16_t; // 大端 Bid Endian
/******************************       大小端      ************************************/

/******************************  Memory Operation ************************************/
/**
 * @brief 复制内存区域
 * @param Dst 内存区域
 * @param Src 内存区域
 * @param Length 内存区域长度
 *
 */
#define MemoryCopy(Dst, Src, Length) memcpy(Dst, Src, Length)

/**
 * @brief 设置内存区域
 * @param Dst 内存区域
 * @param Data 数据
 * @param Length 内存区域长度
 *
 */
#define MemorySet(Dst, Data, Length) memset(Dst, Data, Length)

/**
 * @brief 比较两个内存区域是否相等
 * @param Src1 内存区域1
 * @param Src2 内存区域2
 * @param Length 内存区域长度
 * @return uint8_t 0:相等，1:不相等
 */
#define MemoryCompare(Src1, Src2, Length) memcmp(Src1, Src2, Length)

/******************************  Memory Operation ************************************/

/******************************     Data Check    ************************************/
uint32_t CRC32(uint8_t *Buffer, uint32_t Length);
uint16_t CRC16(uint8_t *Buffer, uint32_t Length);
uint8_t CRC8(uint8_t *Buffer, uint32_t Length);
/******************************     Data Check    ************************************/

#endif
